﻿using Furion;
using Furion.DependencyInjection;
using Furion.Logging;
using Furion.Logging.Extensions;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FurStudy.Application
{
    public class PrivacyModel : PageModel
    {
        private readonly ILogger<PrivacyModel> _logger; // 通过泛型ILogger<T>方式写入日志，那么默认将T类型完整类型名称作为日志类别
        private readonly ILogger _loggerFactory; // ILoggerFactory工厂方式需手动传入日志类别

        public PrivacyModel(ILogger<PrivacyModel> logger, ILoggerFactory loggerFactory)
        {
            _logger = logger;
            _loggerFactory = loggerFactory.CreateLogger("MyCategory");
        }

        public void OnGet()
        {
            _logger.LogInformation("GET Pages.PrivacyModel called.");

            // 懒人模式：直接通过字符串拓展的方式写入
            "简单日志".LogInformation();
            "百小僧 新增了一条记录".LogInformation<TestModel>();
            "程序出现异常啦".LogError<TestModel>();
            "这是自定义类别日志".SetCategory("类别").LogInformation();

            // 打印日志到Swagger中
            App.PrintToMiniProfiler("分类", "状态", "要打印的消息");

            #region 关于日志文件重复生成的问题

            // 日志重复生成的原因是创建了多个ILogger对象导致的，通常有两种解决方法：

            // 1、设置字符串拓展日志作用域
            IServiceProvider serviceProvider = null; // 示例编写下方代码用
            "日志内容".SetLoggerScoped(serviceProvider).LogInformation();

            // 2、修改Program.cs注册方式
            // UseStartup<Startup>().UseSerilogDefault();   // 写到这里

            #endregion

            // 多线程共享作用域
            Scoped.Create(async (fac, scope) => {
                "写日志".SetLoggerScoped(scope.ServiceProvider).LogInformation();
            });

            // 静态Default方式构建
            StringLoggingPart.Default.SetMessage("这是一个日志").LogInformation();
        }
    }
}
